/**
 * 分类控制器
 * @module controllers/categoryController
 */

const { Category } = require('../models');

/**
 * 获取所有分类
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @returns {Object} 响应对象
 */
const getAllCategories = async (req, res) => {
  try {
    const categories = await Category.findAll({
      order: [['name', 'ASC']]
    });
    
    return res.status(200).json({ categories });
  } catch (error) {
    console.error('获取分类列表错误:', error);
    return res.status(500).json({ message: '服务器错误' });
  }
};

/**
 * 获取单个分类
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @returns {Object} 响应对象
 */
const getCategoryById = async (req, res) => {
  try {
    const { id } = req.params;
    
    const category = await Category.findByPk(id);
    if (!category) {
      return res.status(404).json({ message: '分类不存在' });
    }
    
    return res.status(200).json({ category });
  } catch (error) {
    console.error('获取分类详情错误:', error);
    return res.status(500).json({ message: '服务器错误' });
  }
};

/**
 * 创建分类
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @returns {Object} 响应对象
 */
const createCategory = async (req, res) => {
  try {
    const { name, description } = req.body;
    
    // 验证请求体
    if (!name) {
      return res.status(400).json({ message: '分类名称不能为空' });
    }
    
    // 检查分类名是否已存在
    const existingCategory = await Category.findOne({ where: { name } });
    if (existingCategory) {
      return res.status(400).json({ message: '分类名称已存在' });
    }
    
    // 创建分类
    const category = await Category.create({
      name,
      description,
      postCount: 0
    });
    
    return res.status(201).json({ 
      message: '分类创建成功',
      category
    });
  } catch (error) {
    console.error('创建分类错误:', error);
    return res.status(500).json({ message: '服务器错误' });
  }
};

/**
 * 更新分类
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @returns {Object} 响应对象
 */
const updateCategory = async (req, res) => {
  try {
    const { id } = req.params;
    const { name, description } = req.body;
    
    // 查找分类
    const category = await Category.findByPk(id);
    if (!category) {
      return res.status(404).json({ message: '分类不存在' });
    }
    
    // 如果更改了名称，检查是否已存在
    if (name && name !== category.name) {
      const existingCategory = await Category.findOne({ where: { name } });
      if (existingCategory) {
        return res.status(400).json({ message: '分类名称已存在' });
      }
    }
    
    // 更新分类
    await category.update({
      name: name || category.name,
      description: description !== undefined ? description : category.description
    });
    
    return res.status(200).json({ 
      message: '分类更新成功',
      category
    });
  } catch (error) {
    console.error('更新分类错误:', error);
    return res.status(500).json({ message: '服务器错误' });
  }
};

/**
 * 删除分类
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @returns {Object} 响应对象
 */
const deleteCategory = async (req, res) => {
  try {
    const { id } = req.params;
    
    // 查找分类
    const category = await Category.findByPk(id);
    if (!category) {
      return res.status(404).json({ message: '分类不存在' });
    }
    
    // 检查分类是否有关联的文章
    if (category.postCount > 0) {
      return res.status(400).json({ message: '无法删除有关联文章的分类' });
    }
    
    // 删除分类
    await category.destroy();
    
    return res.status(200).json({ message: '分类删除成功' });
  } catch (error) {
    console.error('删除分类错误:', error);
    return res.status(500).json({ message: '服务器错误' });
  }
};

module.exports = {
  getAllCategories,
  getCategoryById,
  createCategory,
  updateCategory,
  deleteCategory
}; 